const express = require('express');
const session = require('express-session');
const crypto = require('crypto');
const cookieParser = require('cookie-parser');

const app = express();
const port = 3000;

// 使用cookie-parser中间件, 解析cookie, 要不然拿不到请求中的cookie信息
app.use(cookieParser());

app.use(session({
    secret: '7b09c869cf04011d6af56827bf1d916890f30caf52ff631113bfeb8c5d129b459ec258e1a6642d640e7725d0282305c8fc941bdca15d2e719f6bdc938de232e3', // 此秘钥用于对 session 数据进行签名, 用户防止客户端修改sessionId，冒充其他用户
    resave: false, // 是否在每次请求时都重新保存 session
    saveUninitialized: true, // 是否保存未初始化的 session
    cookie: { secure: false } // 设置 cookie 的属性
}))

// 获取sessionId
app.get('/getSessionId', (req, res) => {
    // 将sessionId返回给客户端
    let sessionId = req.sessionID;
    console.log(`sessionId为${sessionId}`);
    res.send(sessionId);
})

// 获取请求中的cookie信息
app.get('/getCookie', (req, res) => {
    let cookies = req.cookies;
    for (const key in cookies) {
        console.log(`cookie的key为${key}, value为${cookies[key]}`);
    }
    res.send("ok");
})

// 设置session的值
app.get('/setSession', (req, res) => {
    // 这里我们将请求参数中的username存储到session中
    // 需要注意的是：我们通过req.session来获取到的session对象，是每个客户端sessionID对应的session对象，
    // 不同用户的session对象是不同的，就好像每个用户都有自己的购物车一样
    let session = req.session;
    session.username = req.query.username;
    res.send('set session success');
})

// 获取sesion的值
app.get('/getSession', (req, res) => {
    // 将用户存储的session值返回给客户端
    res.send(req.session.username);
})

// 生成秘钥
app.get('/generateSecret', (req, res) => {
    let secret = crypto.randomBytes(64).toString('hex');
    res.send(secret);
})

// 启动服务器
app.listen(port, () => {
  console.log(`服务器已启动，运行端口号是：${port}`)
})

